#pragma once

#include <QWidget>
#include <QVBoxLayout>
#include <QStackedWidget>
#include <QList>

class DockTab;
class DockingTabWell;
class DockingSplitter;

/**
 * DockingTabStack - 标签页栈容器
 * 组合DockingTabWell(标签栏) + QStackedWidget(内容区域)
 * 管理标签页与内容的对应关系
 */
class DockingTabStack : public QWidget {
    Q_OBJECT
    
public:
    explicit DockingTabStack(DockingSplitter* parentSplitter = nullptr, QWidget* parent = nullptr);
    ~DockingTabStack();
    
    // === 标签页和内容管理 ===
    DockTab* addTab(const QString& title, QWidget* content, int index = -1);
    DockTab* addTab(const QIcon& icon, const QString& title, QWidget* content, int index = -1);
    void removeTab(DockTab* tab);
    void removeTab(int index);
    void clear();
    
    // === 激活状态管理 ===
    void setCurrentTab(DockTab* tab);
    void setCurrentTab(int index);
    DockTab* currentTab() const;
    int currentIndex() const;
    QWidget* currentContent() const;
    
    // === 标签页查询 ===
    int tabCount() const;
    QList<DockTab*> tabs() const;
    DockTab* tabAt(int index) const;
    QWidget* contentAt(int index) const;
    int tabIndex(DockTab* tab) const;
    
    // === 组件访问 ===
    DockingTabWell* tabWell() const { return m_tabWell; }
    
    // === 布局管理 ===
    bool isTabBarVisible() const;
    void setTabBarVisible(bool visible);
    void setTabPosition(Qt::Edge edge = Qt::TopEdge);
    
    // === 特殊功能 ===
    bool isEmpty() const { return tabCount() == 0; }
    bool hasMainTab() const; // 是否有主标签
    DockTab* mainTab() const; // 获取主标签（无论在什么位置）
    
    // === 拖拽支持 ===
    bool handleDropEvent(QDropEvent* event);
    
    // === 拖拽集成 ===
    bool acceptsTab(DockTab* tab) const;
    void adoptTab(DockTab* tab, int index = -1);
    DockTab* releaseTab(int index);

signals:
    // 标签页事件
    void tabAdded(DockTab* tab, int index);
    void tabRemoved(DockTab* tab, int index); 
    void tabActivated(DockTab* tab, int index);
    void tabMoved(DockTab* tab, int fromIndex, int toIndex);
    void tabCloseRequested(DockTab* tab);
    
    // 内容切换事件
    void currentChanged(int index);
    void currentTabChanged(DockTab* tab);
    void contentChanged(QWidget* content);
    
    // 拖拽事件
    void tabPullOutRequested(DockTab* tab, const QPoint& globalPos);
    void tabReturnedToStack(DockTab* tab);
    
    // 栈状态事件
    void stackBecameEmpty();
    void stackBecameNonEmpty();

protected:
    // === Qt事件重写 ===
    void resizeEvent(QResizeEvent* event) override;
    void showEvent(QShowEvent* event) override;
    void hideEvent(QHideEvent* event) override;
    
    // === 拖放支持 ===
    void dragEnterEvent(QDragEnterEvent* event) override;
    void dragMoveEvent(QDragMoveEvent* event) override;
    void dragLeaveEvent(QDragLeaveEvent* event) override;
    void dropEvent(QDropEvent* event) override;

private slots:
    // === TabWell事件处理 ===
    void onTabWellTabAdded(DockTab* tab, int index);
    void onTabWellTabRemoved(DockTab* tab, int index);
    void onTabWellTabActivated(DockTab* tab, int index);
    void onTabWellTabMoved(DockTab* tab, int fromIndex, int toIndex);
    void onTabWellTabCloseRequested(DockTab* tab);
    void onTabWellTabPullOutRequested(DockTab* tab, const QPoint& globalPos);

private:
    // === 初始化 ===
    void setupTabStack();
    void setupLayout();
    void setupConnections();
    
    // === 内容管理 ===
    void syncTabWithContent(DockTab* tab, QWidget* content);
    
    // === 同步操作 ===
    void syncCurrentTabWithContent();
    void ensureValidCurrentTab();
    void updateTabWellVisibility();
    
    // === 工具函数 ===
    int findContentIndex(QWidget* content) const;
    void validateTabContentSync() const; // Debug用：验证标签和内容的同步性

private:
    // === 核心组件 ===
    DockingSplitter* m_parentSplitter;
    DockingTabWell* m_tabWell;
    QVBoxLayout* m_mainLayout;
    
    // === 标签内容映射 ===
    QList<DockTab*> m_tabs;           // 标签页列表（与TabWell同步）
    QList<QWidget*> m_contents;       // 内容列表（与StackedWidget同步）
    
    // === 状态管理 ===
    int m_currentIndex;
    bool m_tabBarVisible;
    Qt::Edge m_tabPosition;
    bool m_syncInProgress;            // 防止递归同步
    
    // === 配置 ===
    bool m_allowEmptyStack;           // 是否允许空栈
    bool m_autoHideTabBar;            // 单标签时自动隐藏标签栏
};

